# 模板方法模式

# ⭐=> 定义了一个算法的框架， 允许子类在不修改结构的情况下重写算法的特定步骤

# 将算法分解为一系列步骤， 然后将这些步骤改写为方法， 最后在 “模板方法” 中依次调用这些方法。 

# 角色
# 抽象类： 定义了算法的框架， 包含抽象方法和模板方法
# 具体类： 实现了抽象类中的抽象方法， 并重写了模板方法
# 客户端： 使用具体类来调用模板方法

from abc import ABC, abstractmethod

class AbstractClass(ABC):
    def template_method(self):
        self.abstract_method()
        self.concrete_method()
        self.hook_method()
    @abstractmethod
    def abstract_method(self):
        pass
    def concrete_method(self):
        print("这是一个具体方法")
    def hook_method(self):
        pass

class ConcreteClass(AbstractClass):
    def abstract_method(self):
        print("这是一个抽象方法")
    def hook_method(self):
        print("这是一个钩子方法")

if __name__ == "__main__":
    concrete_class = ConcreteClass()
    concrete_class.template_method()
    # Output: 这是一个抽象方法 这是一个具体方法 这是一个钩子方法